Program robot tự thoát mê cung bằng quy tắc "luôn giữ một tay chạm tường" — nền tảng thuật toán tìm đường trong Tin học và robotics.
Thuật toán bám tường là gì?
Giả sử bạn đứng trong mê cung tối, chỉ sờ được tường hai bên. Một cách thoát ra là luôn để một tay (trái hoặc phải) chạm tường và bước theo — đó gọi là thuật toán bám tường (wall follower).
Dự án lớp 9: robot Scratch tự di chuyển trong mê cung — không điều khiển bằng phím
Trên Scratch, bạn lập trình sprite "robot" tự quyết định rẽ trái, đi thẳng hay quay đầu dựa trên việc có chạm tường phía trước, bên trái hay bên phải — mô phỏng cảm biến robot thật.
Quy tắc tay phải
Luôn ưu tiên giữ tường bên phải. Rẽ phải khi được, không thì thẳng, không thì rẽ trái.
Quy tắc tay trái
Đối xứng — luôn bám tường bên trái. Chọn một quy tắc và giữ nguyên suốt mê cung.
💡 Ghi nhớ
Thuật toán này đảm bảo tìm lối ra với mê cung "đơn giản liên thông" — mọi tường nối với nhau hoặc với mép ngoài, có một lối vào và một lối ra. Không đổi giữa tay trái và tay phải giữa chừng.
Chuẩn bị mê cung và robot
Thiết kế
Vẽ phông nền mê cung: tường một màu đậm (ví dụ xanh navy), lối đi màu sáng, có cửa vào và vùng đích (màu xanh lá).
Sprite robot nhỏ gọn — hình vuông hoặc mũi tên chỉ hướng. Hướng sprite = hướng "phía trước".
Đặt robot tại cửa vào, hướng vào trong mê cung.
Tường dày, không khe hở — robot không được "lọt" qua.
Khối "chạm màu …?" dùng để robot "cảm nhận" tường xung quanh
Cách robot "nhìn" ba phía
Scratch không có cảm biến riêng cho trái/phải/trước. Ta quay robot tạm thời rồi kiểm tra chạm màu tường:
Phía trước: kiểm tra ngay hướng hiện tại.
Bên phải: quay 90° phải → kiểm tra → quay lại.
Bên trái: quay 90° trái → kiểm tra → quay lại.
📌 Mẹo: dùng My Block
Tạo khối tường_bên_phải? trả về đúng/sai: quay 90°, nếu chạm màu tường → đúng, quay lại -90°. Tương tự tường_phía_trước? và tường_bên_trái? — code gọn, dễ đọc.
⚠️ Lưu ý
Sau mỗi lần quay thử, phải quay về hướng cũ trước khi bước tiếp. Nếu không, robot mất phương hướng.
Logic quy tắc tay phải
Thuật toán
Mỗi bước lặp, robot quyết định theo thứ tự ưu tiên:
Không có tường bên phải → rẽ phải 90°, tiến một bước (ô).
Ngược lại, không có tường phía trước → tiến thẳng một bước.
Ngược lại, có tường trước → rẽ trái 90° (bỏ qua tường trước).
Ngõ cụt (tường trước, trái, phải) → quay 180°.
khi nhận được [bat_dau v] lặp mãi nếu <không <tường_bên_phải?>> thì quay [90] độ tiến [12] bước kết thúc nếu không thì nếu <không <tường_phía_trước?>> thì tiến [12] bước kết thúc nếu không thì quay [-90] độ kết thúc kết thúc đợi [0.1] giây nếu <chạm màu [#33cc33]?> thì nói [Đã đến đích!] trong [2] giây dừng [script này v] kết thúc kết thúc
Số bước 12 căn theo độ rộng lối đi — test để robot không xuyên tường hay kẹt giữa ô.
💡 Quy tắc tay trái
Đảo ưu tiên: kiểm tra trái trước, rẽ trái khi trống; không thì thẳng; không thì rẽ phải. Cùng một mê cung, đường đi có thể khác nhưng vẫn thoát được nếu mê cung hợp lệ.
Triển khai từng bước trên Scratch
Bước 1: Khởi động
khi nhấn cờ xanh đi tới x: [-180] y: [120] hướng về hướng [90] phát thông báo [bat_dau v]
Bước 2: Tốc độ và quan sát
Thêm đợi 0,1 giây mỗi vòng lặp để mắt người xem kịp robot di chuyển. Tắt đợi khi debug logic.
Bước 3: Nút "Chạy thuật toán"
Thay cờ xanh trực tiếp, dùng màn hình tiêu đề + nút "Bắt đầu" phát bat_dau — UX rõ ràng hơn.
Vòng lặp mãi chứa logic quyết định mỗi bước của robot
Hạn chế và mở rộng
Khi nào thuật toán thất bại?
Robot xuất phát trong vùng tường tách rời (đảo) — bám tường mãi trong vòng lặp cục bộ.
Mê cung có nhiều lối ra — thuật toán tìm được một lối, không nhất thiết ngắn nhất.
Đổi quy tắc tay trái/phải giữa chừng — hành vi không dự đoán được.
📌 So sánh với điều khiển tay
Game mê cung lớp 6: người chơi bấm phím, chạm tường thì lùi. Dự án lớp 9: robot tự suy luận — đây là bước từ "game" sang "thuật toán tìm đường" trong khoa học máy tính.
Hướng mở rộng
Biến số_bước đếm quãng đường — so sánh tay trái vs tay phải trên cùng mê cung.
Nhiều màn mê cung — thắng khi robot chạm đích màn 3.
Ghi lại đường đi bằng extension Pen — vẽ vết robot đã đi.
Kiểm tra và hoàn thiện
Robot có đứng đúng cửa vào, hướng vào trong không?
Chạy thuật toán — robot có xuyên tường không? (giảm bước tiến hoặc tăng độ dày tường)
Robot có đến vùng đích trên mê cung đơn giản?
Thử mê cung phức tạp hơn — thuật toán vẫn thoát?
Quay video ngắn robot tự giải mê cung — trình bày trước lớp.
⚠️ Lỗi thường gặp
Quên khôi phục hướng sau khi kiểm tra tường bên; bước tiến quá dài; màu tường không đồng nhất khiến chạm màu báo sai.
💡 Ghi nhớ
Thuật toán bám tường là ví dụ điển hình của heuristic — quy tắc đơn giản giải bài toán phức tạp. Cùng ý tưởng được dùng trong robot dọn nhà, xe tự hành và AI lập kế hoạch đường đi.